10331. Отгадай животное

 

Когда коровам стало скучно играть в игру ракушки, Бесси и ее подруга Элси любят играть в другую игру, называемую “угадай животное”.

Первоначально Бесси думает о каком-то животном (чаще всего это животное – корова, что делает игру довольно скучной, но иногда Бесси проявляет изобретательность и думает о чем-то другом). Затем Элси задает серию вопросов, чтобы выяснить, какое животное выбрала Бесси. Каждый вопрос спрашивает, есть ли у животного какие-то определенные характеристики, и Бесси отвечает на каждый вопрос “да” или “нет”. Например:

 

Elsie: “Животное летает?”

Bessie: “нет”

Elsie: “Животное ест траву?”

Bessie: “да”

Elsie: “Животное дает молоко?”

Bessie: “да”

Elsie: “Животное говорит муу?”

Bessie: “да”

Elsie: “В таком случае я думаю, что это корова.”

Bessie: “Правильно! ”

 

Назовем “допустимым множеством” набор всех животных с характеристиками, согласующимися с вопросами Элси. Тогда Элси продолжает задавать вопросы до тех пор, пока возможный набор не будет содержать только одно животное, после чего она объявляет это животное в качестве своего ответа. В каждом вопросе Элси выбирает характеристику какого-нибудь животного из возможного набора, чтобы спросить о нем (даже если эта характеристика не сможет помочь ей сузить возможный набор в дальнейшем). Она никогда не спрашивает дважды об одной и той же характеристике.

Зная всех животных, которых знают Бесси и Элси, а также их характеристики, определите максимальное количество ответов “да”, которые Элси могла бы получить, прежде чем она узнает правильное животное.

 

Вход. Первая строка содержит количество животных n (2 ≤ n ≤ 100). Каждая из следующих n строк описывает одно животное. Строка начинается с имени животного, затем целого числа k (1 ≤ k ≤ 100), и k характеристик этого животного. Имена и характеристики животных представляют собой строки, содержащие до 20 строчных букв (a .. z). Нет двух животных с абсолютно одинаковыми характеристиками.

 

Выход. Выведите максимальное количество ответов “да”, которое Элси могла бы получить до окончания игры.

 

Пример входа

Пример выхода

4

bird 2 flies eatsworms

cow 4 eatsgrass isawesome makesmilk goesmoo

sheep 1 eatsgrass

goat 2 makesmilk eatsgrass

3

 

 

РЕШЕНИЕ

перебор

 

Анализ алгоритма

Перебором найдем двух животных с максимальным количеством общих признаков temp. Тогда максимальное количество ответов “да”, которые может получить Элси, равно temp + 1.

 

Пример

Корова и коза имеют два общих признака: makesmilk, eatsgrass. На эти запросы Элси даст ответ “да”. Третьим запросом с ответом “да” будет запрос о признаке коровы, отличный от этих двух.

 

Реализация алгоритма

Характеристики животного номер i будем хранить в массиве ch[i].

 

vector<string> ch[100];

 

Функция common вычисляет количество общих признаков для животных с номерами i и j.

 

int common(int i, int j)

{

  int cnt = 0;

  for (int x = 0; x < ch[i].size(); x++)

  for (int y = 0; y < ch[j].size(); y++)

    if (ch[i][x] == ch[j][y]) cnt++;

  return cnt;

}

 

Основная часть программы. Читаем входные данные.

 

cin >> n;

for (i = 0; i < n; i++)

{

  cin >> s >> k;

  for (j = 0; j < k; j++)

  {

    cin >> s;

    ch[i].push_back(s);

  }

}

 

Перебираем все пары животных. Для каждой пары (i, j) вычисляем количество их общих признаков temp. Среди всех таких значений temp вычисляем наибольшее значение res.

 

res = 0;

for (i = 0; i < n; i++)

for (j = i + 1; j < n; j++)

{

  temp = common(i, j);

  if (temp > res) res = temp;

}

 

Выводим ответ.

 

cout << res + 1 << endl;